aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlistair Popple <alistair@popple.id.au>2017-06-20 14:53:04 +1000
committerStewart Smith <stewart@linux.vnet.ibm.com>2017-06-20 15:49:41 +1000
commitc5549e5b397a6805bcb68f2dc58862867b932b69 (patch)
tree849d95d73c850d11f0f1b044d320f2bbefe008b4
parent1efd38dbf0a1fd5c0604722df1fa9d9107a98dd8 (diff)
downloadskiboot-c5549e5b397a6805bcb68f2dc58862867b932b69.zip
skiboot-c5549e5b397a6805bcb68f2dc58862867b932b69.tar.gz
skiboot-c5549e5b397a6805bcb68f2dc58862867b932b69.tar.bz2
hw/npu2.c: Change MCD BAR allocation order
MCD BARs need to be correctly aligned to the size of the region. As GPU memory is allocated from the top of memory down we should start allocating from the highest GPU memory address to the lowest to ensure correct alignment. Signed-off-by: Alistair Popple <alistair@popple.id.au> Signed-off-by: Stewart Smith <stewart@linux.vnet.ibm.com>
-rw-r--r--hw/npu2.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/hw/npu2.c b/hw/npu2.c
index bdc44e1..6513133 100644
--- a/hw/npu2.c
+++ b/hw/npu2.c
@@ -766,17 +766,22 @@ static void npu2_hw_init(struct npu2 *p)
* across both if total_size is not a power of two. */
total_size = gpu_max_addr - gpu_min_addr;
size = 1ull << ilog2(total_size);
+
+ /* Allocate the biggest chunk first as we assume gpu_max_addr has the
+ * highest alignment. */
+ addr = gpu_max_addr - size;
val = PPC_BIT(0);
val = SETFIELD(PPC_BITMASK(13, 29), val, (size >> 25) - 1);
- val = SETFIELD(PPC_BITMASK(33, 63), val, gpu_min_addr >> 25);
+ val = SETFIELD(PPC_BITMASK(33, 63), val, addr >> 25);
xscom_write(p->chip_id, MCD0_BANK0_CN3, val);
total_size -= size;
if (total_size) {
/* total_size was not a power of two, but the remainder should
* be if all GPUs were assigned the same size. */
assert(is_pow2(total_size));
- addr += size;
size = 1ull << ilog2(total_size);
+ addr -= size;
+ assert(addr <= gpu_min_addr);
val = PPC_BIT(0);
val = SETFIELD(PPC_BITMASK(13, 29), val, (size >> 25) - 1);
val = SETFIELD(PPC_BITMASK(33, 63), val, addr >> 25);