xref: /openbmc/openpower-pnor-code-mgmt/mmc/obmc-flash-bios (revision e8606daa53c6bea2b15fa2efb201c54d8a4f23f1)
1*e8606daaSAdriana Kobylak#!/bin/sh
2*e8606daaSAdriana Kobylak
3*e8606daaSAdriana Kobylakmmc_init() {
4*e8606daaSAdriana Kobylak  base_dir="/media/hostfw"
5*e8606daaSAdriana Kobylak  running_dir="${base_dir}/running"
6*e8606daaSAdriana Kobylak  prsv_dir="${base_dir}/prsv"
7*e8606daaSAdriana Kobylak
8*e8606daaSAdriana Kobylak  if [ ! -d "${running_dir}" ]; then
9*e8606daaSAdriana Kobylak    mkdir -p ${running_dir}
10*e8606daaSAdriana Kobylak  fi
11*e8606daaSAdriana Kobylak  if [ ! -d "${prsv_dir}" ]; then
12*e8606daaSAdriana Kobylak    mkdir -p "${prsv_dir}"
13*e8606daaSAdriana Kobylak  fi
14*e8606daaSAdriana Kobylak
15*e8606daaSAdriana Kobylak  # Determine if the running dir contains the running version
16*e8606daaSAdriana Kobylak  boot_label="$(fw_printenv -n bootside)"
17*e8606daaSAdriana Kobylak  running_label=""
18*e8606daaSAdriana Kobylak  running_label_file="${running_dir}/partlabel"
19*e8606daaSAdriana Kobylak  if [ -f "${running_label_file}" ]; then
20*e8606daaSAdriana Kobylak    running_label=$(cat ${running_label_file})
21*e8606daaSAdriana Kobylak  fi
22*e8606daaSAdriana Kobylak  if [ "${running_label}" != "${boot_label}" ]; then
23*e8606daaSAdriana Kobylak    # Copy off the preserved partitions
24*e8606daaSAdriana Kobylak    # A line in the pnor.toc looks like this:
25*e8606daaSAdriana Kobylak    # partition05=SECBOOT,0x00381000,0x003a5000,00,ECC,PRESERVED
26*e8606daaSAdriana Kobylak    rm -f ${prsv_dir}/*
27*e8606daaSAdriana Kobylak    if [ -f ${running_dir}/pnor.toc ]; then
28*e8606daaSAdriana Kobylak      prsvs=$(grep PRESERVED ${running_dir}/pnor.toc)
29*e8606daaSAdriana Kobylak      for prsv in ${prsvs}; do
30*e8606daaSAdriana Kobylak        prsv=${prsv##partition*=}
31*e8606daaSAdriana Kobylak        prsv=$(echo ${prsv} | cut -d "," -f 1)
32*e8606daaSAdriana Kobylak        cp -p ${running_dir}/${prsv} ${prsv_dir}
33*e8606daaSAdriana Kobylak      done
34*e8606daaSAdriana Kobylak    fi
35*e8606daaSAdriana Kobylak
36*e8606daaSAdriana Kobylak    # Copy contents of running image to running dir
37*e8606daaSAdriana Kobylak    tmp_dir="/tmp/hostfw"
38*e8606daaSAdriana Kobylak    mkdir -p "${tmp_dir}"
39*e8606daaSAdriana Kobylak    mount ${base_dir}/hostfw-${boot_label} ${tmp_dir} -o ro
40*e8606daaSAdriana Kobylak    rm -f ${running_dir}/*
41*e8606daaSAdriana Kobylak    cp -p ${tmp_dir}/* ${running_dir}/
42*e8606daaSAdriana Kobylak    umount ${tmp_dir}
43*e8606daaSAdriana Kobylak    rm -rf ${tmp_dir}
44*e8606daaSAdriana Kobylak
45*e8606daaSAdriana Kobylak    # Restore the preserved partitions
46*e8606daaSAdriana Kobylak    cp -p ${prsv_dir}/* ${running_dir}/ || true
47*e8606daaSAdriana Kobylak    rm -f ${prsv_dir}/*
48*e8606daaSAdriana Kobylak
49*e8606daaSAdriana Kobylak    # Save the label
50*e8606daaSAdriana Kobylak    echo "${boot_label}" > "${running_label_file}"
51*e8606daaSAdriana Kobylak
52*e8606daaSAdriana Kobylak    # Remove patches
53*e8606daaSAdriana Kobylak    rm -f ${base_dir}/patch/*
54*e8606daaSAdriana Kobylak  fi
55*e8606daaSAdriana Kobylak
56*e8606daaSAdriana Kobylak  # Mount alternate dir
57*e8606daaSAdriana Kobylak  if [ "${boot_label}" = "a" ]; then
58*e8606daaSAdriana Kobylak    alternate_label="b"
59*e8606daaSAdriana Kobylak  else
60*e8606daaSAdriana Kobylak    alternate_label="a"
61*e8606daaSAdriana Kobylak  fi
62*e8606daaSAdriana Kobylak  alternate_dir="${base_dir}/alternate"
63*e8606daaSAdriana Kobylak  if [ ! -d "${alternate_dir}" ]; then
64*e8606daaSAdriana Kobylak    mkdir -p ${alternate_dir}
65*e8606daaSAdriana Kobylak  fi
66*e8606daaSAdriana Kobylak  mount ${base_dir}/hostfw-${alternate_label} ${alternate_dir} -o ro
67*e8606daaSAdriana Kobylak}
68*e8606daaSAdriana Kobylak
69*e8606daaSAdriana Kobylakmmc_patch() {
70*e8606daaSAdriana Kobylak  # Patching is disabled if field mode is set
71*e8606daaSAdriana Kobylak  if [[ "$(fw_printenv fieldmode 2>/dev/null)" == "fieldmode=true" ]]; then
72*e8606daaSAdriana Kobylak    return 0
73*e8606daaSAdriana Kobylak  fi
74*e8606daaSAdriana Kobylak
75*e8606daaSAdriana Kobylak  target="/media/hostfw/patch"
76*e8606daaSAdriana Kobylak  if [ ! -d "${target}" ]; then
77*e8606daaSAdriana Kobylak    mkdir -p "${target}"
78*e8606daaSAdriana Kobylak  fi
79*e8606daaSAdriana Kobylak
80*e8606daaSAdriana Kobylak  patchdir="/usr/local/share"
81*e8606daaSAdriana Kobylak  if [ ! -d "${patchdir}" ]; then
82*e8606daaSAdriana Kobylak    mkdir -p "${patchdir}"
83*e8606daaSAdriana Kobylak  fi
84*e8606daaSAdriana Kobylak
85*e8606daaSAdriana Kobylak  ln -s "${target}" "${patchdir}/hostfw"
86*e8606daaSAdriana Kobylak  ln -s "${target}" "${patchdir}/pnor"
87*e8606daaSAdriana Kobylak}
88*e8606daaSAdriana Kobylak
89*e8606daaSAdriana Kobylakcase "$1" in
90*e8606daaSAdriana Kobylak  mmc-init)
91*e8606daaSAdriana Kobylak    mmc_init
92*e8606daaSAdriana Kobylak    ;;
93*e8606daaSAdriana Kobylak  mmc-patch)
94*e8606daaSAdriana Kobylak    mmc_patch
95*e8606daaSAdriana Kobylak    ;;
96*e8606daaSAdriana Kobylak  *)
97*e8606daaSAdriana Kobylak    echo "Invalid argument"
98*e8606daaSAdriana Kobylak    exit 1
99*e8606daaSAdriana Kobylak    ;;
100*e8606daaSAdriana Kobylakesac
101