2c2
< * Copyright (c) 2013 Ruslan Bukin <br@bsdpad.com>
---
> * Copyright (c) 2013-2014 Ruslan Bukin <br@bsdpad.com>
28c28
< __FBSDID("$FreeBSD: head/sys/arm/samsung/exynos/exynos5_mp.c 262409 2014-02-23 22:35:18Z ian $");
---
> __FBSDID("$FreeBSD: head/sys/arm/samsung/exynos/exynos5_mp.c 267388 2014-06-12 11:37:38Z br $");
40c40
< #define EXYNOS_SYSRAM 0x02020000
---
> #define EXYNOS_CHIPID 0x10000000
41a42,68
> #define EXYNOS5250_SOC_ID 0x43520000
> #define EXYNOS5420_SOC_ID 0xE5420000
> #define EXYNOS5_SOC_ID_MASK 0xFFFFF000
>
> #define EXYNOS_SYSRAM 0x02020000
> #define EXYNOS5420_SYSRAM_NS (EXYNOS_SYSRAM + 0x53000 + 0x1c)
>
> #define EXYNOS_PMU_BASE 0x10040000
> #define CORE_CONFIG(n) (0x2000 + (0x80 * (n)))
> #define CORE_STATUS(n) (CORE_CONFIG(n) + 0x4)
> #define CORE_PWR_EN 0x3
>
> static int
> exynos_get_soc_id(void)
> {
> bus_addr_t chipid;
> int reg;
>
> if (bus_space_map(fdtbus_bs_tag, EXYNOS_CHIPID,
> 0x1000, 0, &chipid) != 0)
> panic("Couldn't map chipid\n");
> reg = bus_space_read_4(fdtbus_bs_tag, chipid, 0x0);
> bus_space_unmap(fdtbus_bs_tag, chipid, 0x1000);
>
> return (reg & EXYNOS5_SOC_ID_MASK);
> }
>
53c80,85
< mp_maxid = 1;
---
> if (exynos_get_soc_id() == EXYNOS5420_SOC_ID)
> mp_ncpus = 4;
> else
> mp_ncpus = 2;
>
> mp_maxid = mp_ncpus - 1;
60,61c92
< mp_ncpus = 2;
< return (1);
---
> return (mp_ncpus > 1);
67,68c98,101
< bus_addr_t sysram;
< int err;
---
> bus_addr_t sysram, pmu;
> int err, i, j;
> int status;
> int reg;
70c103
< err = bus_space_map(fdtbus_bs_tag, EXYNOS_SYSRAM, 0x100, 0, &sysram);
---
> err = bus_space_map(fdtbus_bs_tag, EXYNOS_PMU_BASE, 0x20000, 0, &pmu);
71a105,113
> panic("Couldn't map pmu\n");
>
> if (exynos_get_soc_id() == EXYNOS5420_SOC_ID)
> reg = EXYNOS5420_SYSRAM_NS;
> else
> reg = EXYNOS_SYSRAM;
>
> err = bus_space_map(fdtbus_bs_tag, reg, 0x100, 0, &sysram);
> if (err != 0)
73a116,131
> /* Give power to CPUs */
> for (i = 1; i < mp_ncpus; i++) {
> bus_space_write_4(fdtbus_bs_tag, pmu, CORE_CONFIG(i),
> CORE_PWR_EN);
>
> for (j = 10; j >= 0; j--) {
> status = bus_space_read_4(fdtbus_bs_tag, pmu,
> CORE_STATUS(i));
> if ((status & CORE_PWR_EN) == CORE_PWR_EN)
> break;
> DELAY(10);
> if (j == 0)
> printf("Can't power on CPU%d\n", i);
> }
> }
>
81a140
> bus_space_unmap(fdtbus_bs_tag, pmu, 0x20000);
< * Copyright (c) 2013 Ruslan Bukin <br@bsdpad.com>
---
> * Copyright (c) 2013-2014 Ruslan Bukin <br@bsdpad.com>
28c28
< __FBSDID("$FreeBSD: head/sys/arm/samsung/exynos/exynos5_mp.c 262409 2014-02-23 22:35:18Z ian $");
---
> __FBSDID("$FreeBSD: head/sys/arm/samsung/exynos/exynos5_mp.c 267388 2014-06-12 11:37:38Z br $");
40c40
< #define EXYNOS_SYSRAM 0x02020000
---
> #define EXYNOS_CHIPID 0x10000000
41a42,68
> #define EXYNOS5250_SOC_ID 0x43520000
> #define EXYNOS5420_SOC_ID 0xE5420000
> #define EXYNOS5_SOC_ID_MASK 0xFFFFF000
>
> #define EXYNOS_SYSRAM 0x02020000
> #define EXYNOS5420_SYSRAM_NS (EXYNOS_SYSRAM + 0x53000 + 0x1c)
>
> #define EXYNOS_PMU_BASE 0x10040000
> #define CORE_CONFIG(n) (0x2000 + (0x80 * (n)))
> #define CORE_STATUS(n) (CORE_CONFIG(n) + 0x4)
> #define CORE_PWR_EN 0x3
>
> static int
> exynos_get_soc_id(void)
> {
> bus_addr_t chipid;
> int reg;
>
> if (bus_space_map(fdtbus_bs_tag, EXYNOS_CHIPID,
> 0x1000, 0, &chipid) != 0)
> panic("Couldn't map chipid\n");
> reg = bus_space_read_4(fdtbus_bs_tag, chipid, 0x0);
> bus_space_unmap(fdtbus_bs_tag, chipid, 0x1000);
>
> return (reg & EXYNOS5_SOC_ID_MASK);
> }
>
53c80,85
< mp_maxid = 1;
---
> if (exynos_get_soc_id() == EXYNOS5420_SOC_ID)
> mp_ncpus = 4;
> else
> mp_ncpus = 2;
>
> mp_maxid = mp_ncpus - 1;
60,61c92
< mp_ncpus = 2;
< return (1);
---
> return (mp_ncpus > 1);
67,68c98,101
< bus_addr_t sysram;
< int err;
---
> bus_addr_t sysram, pmu;
> int err, i, j;
> int status;
> int reg;
70c103
< err = bus_space_map(fdtbus_bs_tag, EXYNOS_SYSRAM, 0x100, 0, &sysram);
---
> err = bus_space_map(fdtbus_bs_tag, EXYNOS_PMU_BASE, 0x20000, 0, &pmu);
71a105,113
> panic("Couldn't map pmu\n");
>
> if (exynos_get_soc_id() == EXYNOS5420_SOC_ID)
> reg = EXYNOS5420_SYSRAM_NS;
> else
> reg = EXYNOS_SYSRAM;
>
> err = bus_space_map(fdtbus_bs_tag, reg, 0x100, 0, &sysram);
> if (err != 0)
73a116,131
> /* Give power to CPUs */
> for (i = 1; i < mp_ncpus; i++) {
> bus_space_write_4(fdtbus_bs_tag, pmu, CORE_CONFIG(i),
> CORE_PWR_EN);
>
> for (j = 10; j >= 0; j--) {
> status = bus_space_read_4(fdtbus_bs_tag, pmu,
> CORE_STATUS(i));
> if ((status & CORE_PWR_EN) == CORE_PWR_EN)
> break;
> DELAY(10);
> if (j == 0)
> printf("Can't power on CPU%d\n", i);
> }
> }
>
81a140
> bus_space_unmap(fdtbus_bs_tag, pmu, 0x20000);