linux/arch/c6x/kernel/soc.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 *  Miscellaneous SoC-specific hooks.
   4 *
   5 *  Copyright (C) 2011 Texas Instruments Incorporated
   6 *  Author: Mark Salter <msalter@redhat.com>
   7 */
   8#include <linux/module.h>
   9#include <linux/ctype.h>
  10#include <linux/etherdevice.h>
  11#include <asm/setup.h>
  12#include <asm/soc.h>
  13
  14struct soc_ops soc_ops;
  15
  16int soc_get_exception(void)
  17{
  18        if (!soc_ops.get_exception)
  19                return -1;
  20        return soc_ops.get_exception();
  21}
  22
  23void soc_assert_event(unsigned int evt)
  24{
  25        if (soc_ops.assert_event)
  26                soc_ops.assert_event(evt);
  27}
  28
  29static u8 cmdline_mac[6];
  30
  31static int __init get_mac_addr_from_cmdline(char *str)
  32{
  33        int count, i, val;
  34
  35        for (count = 0; count < 6 && *str; count++, str += 3) {
  36                if (!isxdigit(str[0]) || !isxdigit(str[1]))
  37                        return 0;
  38                if (str[2] != ((count < 5) ? ':' : '\0'))
  39                        return 0;
  40
  41                for (i = 0, val = 0; i < 2; i++) {
  42                        val = val << 4;
  43                        val |= isdigit(str[i]) ?
  44                                str[i] - '0' : toupper(str[i]) - 'A' + 10;
  45                }
  46                cmdline_mac[count] = val;
  47        }
  48        return 1;
  49}
  50__setup("emac_addr=", get_mac_addr_from_cmdline);
  51
  52/*
  53 * Setup the MAC address for SoC ethernet devices.
  54 *
  55 * Before calling this function, the ethernet driver will have
  56 * initialized the addr with local-mac-address from the device
  57 * tree (if found). Allow command line to override, but not
  58 * the fused address.
  59 */
  60int soc_mac_addr(unsigned int index, u8 *addr)
  61{
  62        int i, have_dt_mac = 0, have_cmdline_mac = 0, have_fuse_mac = 0;
  63
  64        for (i = 0; i < 6; i++) {
  65                if (cmdline_mac[i])
  66                        have_cmdline_mac = 1;
  67                if (c6x_fuse_mac[i])
  68                        have_fuse_mac = 1;
  69                if (addr[i])
  70                        have_dt_mac = 1;
  71        }
  72
  73        /* cmdline overrides all */
  74        if (have_cmdline_mac)
  75                memcpy(addr, cmdline_mac, 6);
  76        else if (!have_dt_mac) {
  77                if (have_fuse_mac)
  78                        memcpy(addr, c6x_fuse_mac, 6);
  79                else
  80                        eth_random_addr(addr);
  81        }
  82
  83        /* adjust for specific EMAC device */
  84        addr[5] += index * c6x_num_cores;
  85        return 1;
  86}
  87EXPORT_SYMBOL_GPL(soc_mac_addr);
  88