From fc43dca9e75b87d24a16d5be7b497e83837d9d31 Mon Sep 17 00:00:00 2001 From: Masakazu Mokuno Date: Wed, 29 Aug 2007 20:30:25 +0900 Subject: [POWERPC] PS3: Fix bug where the major version part is not compared Fix the bug that the major version part of the firmware version number is ignored in the comparison done by ps3_compare_firmware_version because the difference of two 64-bit quantities is returned as an int. Signed-off-by: Masakazu Mokuno Acked-by: Geoff Levand Signed-off-by: Paul Mackerras --- arch/powerpc/platforms/ps3/setup.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'arch/powerpc/platforms/ps3') diff --git a/arch/powerpc/platforms/ps3/setup.c b/arch/powerpc/platforms/ps3/setup.c index 2952b22f1c8..609945dbe39 100644 --- a/arch/powerpc/platforms/ps3/setup.c +++ b/arch/powerpc/platforms/ps3/setup.c @@ -63,7 +63,8 @@ int ps3_compare_firmware_version(u16 major, u16 minor, u16 rev) x.minor = minor; x.rev = rev; - return (ps3_firmware_version.raw - x.raw); + return (ps3_firmware_version.raw > x.raw) - + (ps3_firmware_version.raw < x.raw); } EXPORT_SYMBOL_GPL(ps3_compare_firmware_version); -- cgit v1.2.3 From ef8034d01a080e81488e9cf74052acf1e2a37bd0 Mon Sep 17 00:00:00 2001 From: Jeremy Kerr Date: Fri, 7 Sep 2007 18:28:27 +1000 Subject: [POWERPC] cell/PS3: Always set master run control bit in mfc_sr1_set At present, running any SPE program on the ps3 will trigger a BUG_ON when spufs_run_spu tries to clear the master run control bit, as lv1 does not make the master run control available to Linux. This change makes SPE apps work again by disabling changes to the master run control on PS3. Although we don't have the facility to disable a SPE with supervisor-level privileges, it's better than hitting the BUG_ON unconditionally. Signed-off-by: Jeremy Kerr Acked-by: Masato Noguchi Signed-off-by: Paul Mackerras --- arch/powerpc/platforms/ps3/spu.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'arch/powerpc/platforms/ps3') diff --git a/arch/powerpc/platforms/ps3/spu.c b/arch/powerpc/platforms/ps3/spu.c index ac2a4b8a4c1..d1630a074ac 100644 --- a/arch/powerpc/platforms/ps3/spu.c +++ b/arch/powerpc/platforms/ps3/spu.c @@ -505,6 +505,8 @@ static void mfc_sr1_set(struct spu *spu, u64 sr1) static const u64 allowed = ~(MFC_STATE1_LOCAL_STORAGE_DECODE_MASK | MFC_STATE1_PROBLEM_STATE_MASK); + sr1 |= MFC_STATE1_MASTER_RUN_CONTROL_MASK; + BUG_ON((sr1 & allowed) != (spu_pdata(spu)->cache.sr1 & allowed)); spu_pdata(spu)->cache.sr1 = sr1; -- cgit v1.2.3 From d51dd3de87026cb0ea1ea5f873f08e930053bfc5 Mon Sep 17 00:00:00 2001 From: Geert Uytterhoeven Date: Thu, 6 Sep 2007 18:14:57 +0200 Subject: [POWERPC] cell/PS3: Ignore storage devices that are still being probed On PS3, A storage device may show up in the repository before the hypervisor has finished probing: - If its type is not yet known, it shows up as PS3_DEV_TYPE_STOR_DUMMY, - If its regions are being probed, it shows up as having zero regions. If any of these happen, consider the device not yet present. The storage probe thread will retry later. This fixes the timing-dependent problem where a kernel booted from FLASH ROM sometimes cannot find the hard disk. Signed-off-by: Geert Uytterhoeven Acked-by: Geoff Levand Signed-off-by: Paul Mackerras --- arch/powerpc/platforms/ps3/platform.h | 1 + arch/powerpc/platforms/ps3/repository.c | 29 +++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) (limited to 'arch/powerpc/platforms/ps3') diff --git a/arch/powerpc/platforms/ps3/platform.h b/arch/powerpc/platforms/ps3/platform.h index 87d52060fec..2eb8f92704b 100644 --- a/arch/powerpc/platforms/ps3/platform.h +++ b/arch/powerpc/platforms/ps3/platform.h @@ -83,6 +83,7 @@ enum ps3_dev_type { PS3_DEV_TYPE_STOR_ROM = TYPE_ROM, /* 5 */ PS3_DEV_TYPE_SB_GPIO = 6, PS3_DEV_TYPE_STOR_FLASH = TYPE_RBC, /* 14 */ + PS3_DEV_TYPE_STOR_DUMMY = 32, PS3_DEV_TYPE_NOACCESS = 255, }; diff --git a/arch/powerpc/platforms/ps3/repository.c b/arch/powerpc/platforms/ps3/repository.c index 8cc37cfea0f..1c94824f7b6 100644 --- a/arch/powerpc/platforms/ps3/repository.c +++ b/arch/powerpc/platforms/ps3/repository.c @@ -349,6 +349,35 @@ int ps3_repository_find_device(struct ps3_repository_device *repo) return result; } + if (tmp.bus_type == PS3_BUS_TYPE_STORAGE) { + /* + * A storage device may show up in the repository before the + * hypervisor has finished probing its type and regions + */ + unsigned int num_regions; + + if (tmp.dev_type == PS3_DEV_TYPE_STOR_DUMMY) { + pr_debug("%s:%u storage device not ready\n", __func__, + __LINE__); + return -ENODEV; + } + + result = ps3_repository_read_stor_dev_num_regions(tmp.bus_index, + tmp.dev_index, + &num_regions); + if (result) { + pr_debug("%s:%d read_stor_dev_num_regions failed\n", + __func__, __LINE__); + return result; + } + + if (!num_regions) { + pr_debug("%s:%u storage device has no regions yet\n", + __func__, __LINE__); + return -ENODEV; + } + } + result = ps3_repository_read_dev_id(tmp.bus_index, tmp.dev_index, &tmp.dev_id); -- cgit v1.2.3