board: dragonboard410c: import board code from mach-snapdragon
Some of the db410c board support code was written to be generic and placed in mach-snapdragon. However, as the db410c is the only board using this, move the code out of mach-snapdragon. This makes is more obvious what code is relevant for which targets and helps tidy things up a little more. Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org> Reviewed-by: Sumit Garg <sumit.garg@linaro.org> Tested-by: Sumit Garg <sumit.garg@linaro.org> #qcs404 Signed-off-by: Caleb Connolly <caleb.connolly@linaro.org>
This commit is contained in:
@@ -6,6 +6,4 @@ obj-$(CONFIG_SDM845) += sysmap-sdm845.o
|
||||
obj-$(CONFIG_SDM845) += init_sdm845.o
|
||||
obj-$(CONFIG_TARGET_DRAGONBOARD820C) += sysmap-apq8096.o
|
||||
obj-$(CONFIG_TARGET_DRAGONBOARD410C) += sysmap-apq8016.o
|
||||
obj-y += misc.o
|
||||
obj-y += dram.o
|
||||
obj-$(CONFIG_TARGET_QCS404EVB) += sysmap-qcs404.o
|
||||
|
||||
@@ -1,99 +0,0 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* Onboard memory detection for Snapdragon boards
|
||||
*
|
||||
* (C) Copyright 2018 Ramon Fried <ramon.fried@gmail.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <dm.h>
|
||||
#include <log.h>
|
||||
#include <part.h>
|
||||
#include <smem.h>
|
||||
#include <fdt_support.h>
|
||||
#include <asm/arch/dram.h>
|
||||
|
||||
#define SMEM_USABLE_RAM_PARTITION_TABLE 402
|
||||
#define RAM_PART_NAME_LENGTH 16
|
||||
#define RAM_NUM_PART_ENTRIES 32
|
||||
#define CATEGORY_SDRAM 0x0E
|
||||
#define TYPE_SYSMEM 0x01
|
||||
|
||||
struct smem_ram_ptable_hdr {
|
||||
u32 magic[2];
|
||||
u32 version;
|
||||
u32 reserved;
|
||||
u32 len;
|
||||
} __attribute__ ((__packed__));
|
||||
|
||||
struct smem_ram_ptn {
|
||||
char name[RAM_PART_NAME_LENGTH];
|
||||
u64 start;
|
||||
u64 size;
|
||||
u32 attr;
|
||||
u32 category;
|
||||
u32 domain;
|
||||
u32 type;
|
||||
u32 num_partitions;
|
||||
u32 reserved[3];
|
||||
} __attribute__ ((__packed__));
|
||||
|
||||
struct smem_ram_ptable {
|
||||
struct smem_ram_ptable_hdr hdr;
|
||||
u32 reserved; /* Added for 8 bytes alignment of header */
|
||||
struct smem_ram_ptn parts[RAM_NUM_PART_ENTRIES];
|
||||
} __attribute__ ((__packed__));
|
||||
|
||||
#ifndef MEMORY_BANKS_MAX
|
||||
#define MEMORY_BANKS_MAX 4
|
||||
#endif
|
||||
|
||||
int msm_fixup_memory(void *blob)
|
||||
{
|
||||
u64 bank_start[MEMORY_BANKS_MAX];
|
||||
u64 bank_size[MEMORY_BANKS_MAX];
|
||||
size_t size;
|
||||
int i;
|
||||
int count = 0;
|
||||
struct udevice *smem;
|
||||
int ret;
|
||||
struct smem_ram_ptable *ram_ptable;
|
||||
struct smem_ram_ptn *p;
|
||||
|
||||
ret = uclass_get_device_by_name(UCLASS_SMEM, "smem", &smem);
|
||||
if (ret < 0) {
|
||||
printf("Failed to find SMEM node. Check device tree\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
ram_ptable = smem_get(smem, -1, SMEM_USABLE_RAM_PARTITION_TABLE, &size);
|
||||
|
||||
if (!ram_ptable) {
|
||||
printf("Failed to find SMEM partition.\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
/* Check validy of RAM */
|
||||
for (i = 0; i < RAM_NUM_PART_ENTRIES; i++) {
|
||||
p = &ram_ptable->parts[i];
|
||||
if (p->category == CATEGORY_SDRAM && p->type == TYPE_SYSMEM) {
|
||||
bank_start[count] = p->start;
|
||||
bank_size[count] = p->size;
|
||||
debug("Detected memory bank %u: start: 0x%llx size: 0x%llx\n",
|
||||
count, p->start, p->size);
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
if (!count) {
|
||||
printf("Failed to detect any memory bank\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
ret = fdt_fixup_memory_banks(blob, bank_start, bank_size, count);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Snapdragon DRAM
|
||||
* Copyright (C) 2018 Ramon Fried <ramon.fried@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef DRAM_H
|
||||
#define DRAM_H
|
||||
|
||||
int msm_fixup_memory(void *blob);
|
||||
|
||||
#endif
|
||||
@@ -1,13 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Snapdragon DRAM
|
||||
* Copyright (C) 2018 Ramon Fried <ramon.fried@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef MISC_H
|
||||
#define MISC_H
|
||||
|
||||
u32 msm_board_serial(void);
|
||||
void msm_generate_mac_addr(u8 *mac);
|
||||
|
||||
#endif
|
||||
@@ -1,55 +0,0 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* Miscellaneous Snapdragon functionality
|
||||
*
|
||||
* (C) Copyright 2018 Ramon Fried <ramon.fried@gmail.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <mmc.h>
|
||||
#include <asm/arch/misc.h>
|
||||
#include <asm/unaligned.h>
|
||||
|
||||
/* UNSTUFF_BITS macro taken from Linux Kernel: drivers/mmc/core/sd.c */
|
||||
#define UNSTUFF_BITS(resp, start, size) \
|
||||
({ \
|
||||
const int __size = size; \
|
||||
const u32 __mask = (__size < 32 ? 1 << __size : 0) - 1; \
|
||||
const int __off = 3 - ((start) / 32); \
|
||||
const int __shft = (start) & 31; \
|
||||
u32 __res; \
|
||||
\
|
||||
__res = resp[__off] >> __shft; \
|
||||
if (__size + __shft > 32) \
|
||||
__res |= resp[__off - 1] << ((32 - __shft) % 32); \
|
||||
__res & __mask; \
|
||||
})
|
||||
|
||||
u32 msm_board_serial(void)
|
||||
{
|
||||
struct mmc *mmc_dev;
|
||||
|
||||
mmc_dev = find_mmc_device(0);
|
||||
if (!mmc_dev)
|
||||
return 0;
|
||||
|
||||
if (mmc_init(mmc_dev))
|
||||
return 0;
|
||||
|
||||
return UNSTUFF_BITS(mmc_dev->cid, 16, 32);
|
||||
}
|
||||
|
||||
void msm_generate_mac_addr(u8 *mac)
|
||||
{
|
||||
/* use locally adminstrated pool */
|
||||
mac[0] = 0x02;
|
||||
mac[1] = 0x00;
|
||||
|
||||
/*
|
||||
* Put the 32-bit serial number in the last 32-bit of the MAC address.
|
||||
* Use big endian order so it is consistent with the serial number
|
||||
* written as a hexadecimal string, e.g. 0x1234abcd -> 02:00:12:34:ab:cd
|
||||
*/
|
||||
put_unaligned_be32(msm_board_serial(), &mac[2]);
|
||||
}
|
||||
@@ -2,4 +2,4 @@
|
||||
#
|
||||
# (C) Copyright 2015 Mateusz Kulikowski <mateusz.kulikowski@gmail.com>
|
||||
|
||||
obj-y := dragonboard410c.o
|
||||
obj-y := dragonboard410c.o
|
||||
|
||||
@@ -12,14 +12,13 @@
|
||||
#include <dm/pinctrl.h>
|
||||
#include <env.h>
|
||||
#include <init.h>
|
||||
#include <mmc.h>
|
||||
#include <net.h>
|
||||
#include <usb.h>
|
||||
#include <asm/cache.h>
|
||||
#include <asm/global_data.h>
|
||||
#include <asm/gpio.h>
|
||||
#include <fdt_support.h>
|
||||
#include <asm/arch/dram.h>
|
||||
#include <asm/arch/misc.h>
|
||||
#include <linux/delay.h>
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
@@ -55,6 +54,49 @@ int board_usb_init(int index, enum usb_init_type init)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* UNSTUFF_BITS macro taken from Linux Kernel: drivers/mmc/core/sd.c */
|
||||
#define UNSTUFF_BITS(resp, start, size) \
|
||||
({ \
|
||||
const int __size = size; \
|
||||
const u32 __mask = (__size < 32 ? 1 << __size : 0) - 1; \
|
||||
const int __off = 3 - ((start) / 32); \
|
||||
const int __shft = (start) & 31; \
|
||||
u32 __res; \
|
||||
\
|
||||
__res = resp[__off] >> __shft; \
|
||||
if (__size + __shft > 32) \
|
||||
__res |= resp[__off - 1] << ((32 - __shft) % 32); \
|
||||
__res & __mask; \
|
||||
})
|
||||
|
||||
static u32 msm_board_serial(void)
|
||||
{
|
||||
struct mmc *mmc_dev;
|
||||
|
||||
mmc_dev = find_mmc_device(0);
|
||||
if (!mmc_dev)
|
||||
return 0;
|
||||
|
||||
if (mmc_init(mmc_dev))
|
||||
return 0;
|
||||
|
||||
return UNSTUFF_BITS(mmc_dev->cid, 16, 32);
|
||||
}
|
||||
|
||||
static void msm_generate_mac_addr(u8 *mac)
|
||||
{
|
||||
/* use locally adminstrated pool */
|
||||
mac[0] = 0x02;
|
||||
mac[1] = 0x00;
|
||||
|
||||
/*
|
||||
* Put the 32-bit serial number in the last 32-bit of the MAC address.
|
||||
* Use big endian order so it is consistent with the serial number
|
||||
* written as a hexadecimal string, e.g. 0x1234abcd -> 02:00:12:34:ab:cd
|
||||
*/
|
||||
put_unaligned_be32(msm_board_serial(), &mac[2]);
|
||||
}
|
||||
|
||||
/* Check for vol- button - if pressed - stop autoboot */
|
||||
int misc_init_r(void)
|
||||
{
|
||||
@@ -103,8 +145,6 @@ int ft_board_setup(void *blob, struct bd_info *bd)
|
||||
{
|
||||
u8 mac[ARP_HLEN];
|
||||
|
||||
msm_fixup_memory(blob);
|
||||
|
||||
if (!eth_env_get_enetaddr("wlanaddr", mac)) {
|
||||
msm_generate_mac_addr(mac);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user